#ifndef PROCESS_H_
#define PROCESS_H_

#include "types.h"
#include "mmu.h"

struct proc_context {
    u64 ra; // 返回地址
    u64 sp; // 栈地址
    u64 gp;
    u64 tp;
    u64 t0;
    u64 t1;
    u64 t2;
    u64 s0;
    u64 s1;
    u64 a0;
    u64 a1;
    u64 a2;
    u64 a3;
    u64 a4;
    u64 a5;
    u64 a6;
    u64 a7;
    u64 s2;
    u64 s3;
    u64 s4;
    u64 s5;
    u64 s6;
    u64 s7;
    u64 s8;
    u64 s9;
    u64 s10;
    u64 s11;
    u64 t3;
    u64 t4;
    u64 t5;
    u64 t6;
    u64 sepc;
};

enum proc_state { 
    PROC_UNUSED, 
    PROC_USED, 
    PROC_SLEEPING, 
    PROC_RUNNABLE, 
    PROC_RUNNING, 
    PROC_ZOMBIE 
};

struct proc_block {
    void *kstack;               // 进程内核栈

    struct proc_block *next;    // 下一个进程控制块地址
    enum  proc_state state;     // 进程状态
    int   pid;                  // 进程ID

    u32   size;                 // 进程占用内存大小
    u32   tick;                 // 进程时间片

    pagetable_t pgtable;         // 进程页表
    char name[32];               // 进程名字
};

#define CONFIG_SYS_PROCESS_NUM  (64)

void os_proc_init(void);
int  os_proc_create(void(*proc)(void));
void os_proc_ctx_switch(void);
void os_proc_int_ctx_sw(void);
void os_sched(void);
void os_sched_int(void);
void os_proc_tick_handle(void);
void os_yield(void);
void os_start(void);
void proc_test(void);

#endif /* PROCESS_H_ */